iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0

Hi all, 來到第五天,今天目標是是解說下 區塊的產生並將其實做出來。

首先我們的區塊組成如昨天所述:

{
  "Id": 0,
  "Data": "string",
  "Hash": "string",
  "PreviousHash": "string",
  "TimeStamp": DateTime,
  "Nonce": 0
}

其中 Nonce 是每次計算雜湊值時為了讓雜湊值符合計算難易度所需要的亂數。

由於這是個測試用的區塊鏈,所以我們不會考慮到難易度的問題,但為求往後的需要我們還是保留這個參數。

另外,我們還會遇到一個問題,那就是計算 sha256 的雜湊值。

由於他會是個類似於工具的一個類別層級,因此我這邊先將其計算的 method 抽至 HashHelper 這個 Helper 物件中,code 如下:

public static class HashHelper
{
    public static string ToSha256(string data)
    {
        var sha256Hash = SHA256.Create();
        var builder = new StringBuilder();
        
        var bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(data));
        foreach (var t in bytes)
        {
            builder.Append(t.ToString("x2"));
        }
        return builder.ToString();
    } 
}

那我們來列一下今天 coding 部分的驗收條件

  1. 透過 API 產生新區塊
  2. 該區塊是由上一個區塊的雜湊值產生
  3. 透過 API 取得整條鏈的情況

以下是 TDD 開發的過程,供參

Yes

經由影片中,可以發現其實我們的 service 是有瑕疵的,因為在 Service 層我們 hard code 去拿 id=0 的 Block。以正常的邏輯來說,我們應該去拿取目前鏈上最後一個區塊,但由於目前還沒有定義好我們的區塊鏈該存放在哪,因此 Repository 層也沒有所謂的 BlockChain 可以索取資料。

關於 Repository 怎麼跟 BlockChain 的取得最後筆資料來產生下個區塊的雜湊值,目前我打算讓 Repository向資料庫索取,但~~~那是明天的事情了哈。

PS. 暫時解其實可以在 Repository 層定義一個 Field List of Block 來當作區塊鏈物件做使用,但此次專案的scope 是要將 BlockChain 放到資料庫存放,所以就先沒有這樣做。

付上專案 GitHub 任意門~~~

結語: 不小心開賽,導致每天鐵人賽都是 Free Style…


上一篇
Day04 Get the First Block
下一篇
Day06 Use MySQL
系列文
Side-Project:: 為自己打造個可編輯的區塊鏈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言